package com.iot.core.util;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;

import com.witsight.platform.util.lang.MapUtil;
import com.witsight.platform.util.lang.StringUtil;
import com.witsight.platform.util.tools.JsonUtil;

/**   
 * 说明：Json解析工具类
 * @Title: JsonParseUtil.java 
 * @Package com.sany.windfarm.util 
 * @See: {@link #JsonParseUtil()}
 * Copyright: Copyright (c) 2016 
 * Company:sany team by product
 * @author: penght  
 * @date: 2017年2月17日 上午10:52:48 
 * @version: V1.0
 * update Release(文件修正记录)
 * <pre>
 * author--updateDate--description----------------------Flag————
 * penght    2016-8-1    测试XXXXX                        #penght001
 *
 * </pre>
 *
 */
public final class JsonParseUtil {
	// 公共日志对象
	private static final Logger logger = LogManager.getLogger(JsonParseUtil.class);
	// 等级标记字符“.”
	public static final String LEVEL_CHAR = ".";
	
	/**
	 * 
	 * 说明：更新或创建json节点字段
	 * @Title: updateOrCreateField
	 * @See: {@link #updateOrCreateField(Map, String, Object)}
	 * @author penght
	 * @param map 需要更新的数据集合
	 * @param jsonKey 关键字
	 * @param val 需要更新的值
	 * @return 更新完成的对象返回
	 * @date: 2017年2月17日 下午1:52:03
	 */
	public static Map<String,Object> updateOrCreateField(Map<String,Object> map, String jsonKey, Object val){
		if (StringUtil.isEmpty(jsonKey)) {
			return map;
		}
		if (map == null) {
			map = new LinkedHashMap<String,Object>();
		}
		// 以LEVEL_CHAR配置的作为层级分割关键字
		String[] keys = StringUtil.split(jsonKey, LEVEL_CHAR);
		
		Map<String,Object> childMap = map;
		for (int i = 0; i < keys.length; i++) {
			String key = keys[i];
			// 判断是否包含关键字，包含的情况：更新 不包含的情况 新建
			if (childMap.containsKey(key)) {
				Object object = MapUtil.getObject(childMap, key);
				// 判断是否是最后一个key？最后一个key的时候加入值
				if (i == keys.length-1) {
					childMap.put(key, val);
					break;
				}
				if (object instanceof Map) {
					childMap = (Map<String,Object>) object;
				} else {
					Map<String,Object> pMap = new LinkedHashMap<String,Object>();
					childMap.put(key,pMap);
					childMap = pMap;
				}
			} else {
				if (i == keys.length-1) {
					childMap.put(key, val);
					break;
				}
				Map<String,Object> pMap = new LinkedHashMap<String,Object>();
				childMap.put(key,pMap);
				childMap = pMap;
			}
		}
		return map;
	}
	
	/**
	 * 
	 * 说明：根据相对于项目包中的相对路径取得json文件的LinkedHashMap
	 * @Title: getMapByJsonFile
	 * @See: {@link #getMapByJsonFile(String)}
	 * @author penght
	 * @param path 文件路径
	 * @return json文件的LinkedHashMap
	 * @date: 2017年2月17日 上午11:05:33
	 */
	@SuppressWarnings("unchecked")
	public static LinkedHashMap<String,Object> getMapByJsonFile(String path){
		String jsonString = getStringByJsonFile(path);
		return JsonUtil.fromJson(jsonString, LinkedHashMap.class);
	}
	/**
	 * 
	 * 说明：根据相对于项目包中的相对路径取得json文件的字符串
	 * @Title: getStringByJsonFile
	 * @See: {@link #getStringByJsonFile(String)}
	 * @author penght
	 * @param path 文件路径
	 * @return json文件的字符串
	 * @date: 2017年2月17日 上午10:59:00
	 */
	public static String getStringByJsonFile(String path){
		if (StringUtil.isEmpty(path)) {
			return "";
		}
		
		Resource resource = getResourceByJsonFile(path);
		if (resource == null) {
			return "";
		}
		
		try {
			char[] chars = IOUtils.toCharArray(resource.getInputStream());
			String jsonStr = new String(chars);
			return jsonStr;
		} catch (IOException e) {
			if (logger.isErrorEnabled()) {
				logger.error("Json file parse data fail,error message:",e);
			}
		}
		return "";
	}
	
	/**
	 * 
	 * 说明：根据相对于项目包中的相对路径取得json文件的字符串
	 * @Title: getStringByJsonFile
	 * @See: {@link #getStringByJsonFile(String)}
	 * @author penght
	 * @param path 文件路径
	 * @return json文件的字符串
	 * @date: 2017年2月17日 上午10:59:00
	 */
	public static Resource getResourceByJsonFile(String path){
		if (StringUtil.isEmpty(path)) {
			return null;
		}
		try {
			ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();			
			Resource[] resources = resourcePatternResolver.getResources(path);
			if (resources == null || resources.length < 1) {
				if (logger.isInfoEnabled()) {
					logger.info(String.format("{} path is Empty." , path));
				}
				return null;
			}
			
			return resources[0];
		} catch (Exception e) {
			if (logger.isErrorEnabled()) {
				logger.error("Json file parse data fail,error message:",e);
			}			
		}
		
		return null;
	}
}
